#ifndef NO_ARVORE_H_
#define NO_ARVORE_H_

#include <list>
#include <iostream>

/*--------------------------------------------
  No da Arvore Generica
---------------------------------------------*/
class NoArvore
{
    public:

        /*-----------------------------------------------------
          Construtor...
        -----------------------------------------------------*/
        NoArvore();

        /*-----------------------------------------------------
          Destrutor...
        -----------------------------------------------------*/
        ~NoArvore();

        /*-----------------------------------------------------
          Insere um filho no atual e retorna o noFilho
        -----------------------------------------------------*/
        NoArvore* inserirFilho(const char *filho);


        /*-----------------------------------------------------
          Insere um filho no atual e retorna o noFilho
        -----------------------------------------------------*/
        NoArvore* inserirFilho(std::list<std::string> *filho);

        /*-----------------------------------------------------
          Insere um nofilho (pode ser uma subArvore) no atual
          e retorna o noFilho e recalcula os niveis dos nos da
          subarvore
        -----------------------------------------------------*/
        NoArvore* inserirSubArvore(NoArvore *noFilho);

        /*-----------------------------------------------------
          Seta o nivel e o conteudo do no
        -----------------------------------------------------*/
        void setNo(int nivel, const char *filho);

        /*-----------------------------------------------------
          Seta o nivel e o conteudo do no
        -----------------------------------------------------*/
        void setNo(int nivel, std::list<std::string> *filho);
        
        /*-----------------------------------------------------
          Retorna o conteudo do no
        -----------------------------------------------------*/
        char* getConteudo();
        
        /*-----------------------------------------------------
          Retorna o conteudo do no
        -----------------------------------------------------*/
        std::list<std::string>* getExpressao();

        /*-----------------------------------------------------
          Informa se o no atual tem filhos
        -----------------------------------------------------*/
        bool temFilho() const;
        
        /*-----------------------------------------------------
          Retorna o nivel do no atual
        -----------------------------------------------------*/
        int getNivel() const;

        /*-----------------------------------------------------
          Seta o no pai do no atual
        -----------------------------------------------------*/
        void setNoPai(NoArvore *noPai);

        /*-----------------------------------------------------
          Retorna o no pai do no atual
        -----------------------------------------------------*/
        NoArvore* getNoPai() const;
        
        /*-----------------------------------------------------
          Seta o nivel do no
        -----------------------------------------------------*/
        void setNivel(int nivel);
        
        /*-----------------------------------------------------
          Retorna os filhos do no atual
        -----------------------------------------------------*/
        std::list<NoArvore*> *getFilhos() const;

        /*-----------------------------------------------------
          Percorre os nos filho do noAtual de forma recursiva
        -----------------------------------------------------*/
        void percorreNo(int &nivelBase, NoArvore *noAtual);
        
        /*-----------------------------------------------------
          Recalcula o nivel dos nohs filhos do noBase
        -----------------------------------------------------*/
        void recalcularNivel(NoArvore *noBase);
        
        /* para chamar procedimentos */
        std::string nomeProcMepa;

    private:

        char                   *mConteudo;    // conteudo do no
        std::list<std::string> *mExpressao;   // conteudo do no expressao
        int                    mNivel;        // nivel do no
        std::list<NoArvore *>  *mFilhos;      // nos filhos
        NoArvore               *mNoPai;       // no pai
};

#endif /*NO_ARVORE_H_*/
